package com.itbac.mybatisplusspringbootdemo.config;

import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.extension.parsers.BlockAttackSqlParser;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;
import com.itbac.mybatisplusspringbootdemo.injector.MySqlInjector;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页插件
 */
@Configuration
@MapperScan(basePackages = "com.itbac.mybatisplusspringbootdemo.mapper")
public class MybatisPlusConfig {

    /**
     * 分页拦截器
     * 可以使用mybatis-config.xml 配置
     */
//    @Bean
//    public PaginationInterceptor paginationInterceptor() {
//        return new PaginationInterceptor();
//    }

    /**
     * SQL 分析插件
     *   //TODO 全表更新，删除的阻断器 .防止SQL攻击， 仅测试环境使用。
     */
    @Bean
    public SqlExplainInterceptor sqlExplainInterceptor() {
        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
        List<ISqlParser> sqlParserList = new ArrayList<>();

        //TODO 全表更新，删除的阻断器 .防止SQL攻击， 仅测试环境使用。
        sqlParserList.add(new BlockAttackSqlParser());

        sqlExplainInterceptor.setSqlParserList(sqlParserList);

        return sqlExplainInterceptor;
    }
    /**
     * TODO  SQL 执行性能分析插件,开发环境使用，线上不推荐。超时会抛异常
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        //SQL最大执行时长,单位：毫秒
        performanceInterceptor.setMaxTime(1000);

        //SQL是否格式化 默认 false 。
        performanceInterceptor.setFormat(true);

        return performanceInterceptor;
    }
    /**
     * todo 乐观锁 version 版本
     *  set version=newVersion where version = oldVervion
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }

    /**
     * 自定义SQL注入器
     */
    @Bean
    public MySqlInjector mySqlInjector(){
        return new MySqlInjector();
    }


}
